﻿using System;

namespace Honest.MES.Contracts.Attributes
{
    /// <summary>
    /// 模型信息特性，用于标记数据模型类的元数据信息
    /// </summary>
    /// <remarks>
    /// 该特性只能应用于类，且每个类只能应用一次，不支持继承。
    /// 主要用于定义模型的显示名称、分组信息、唯一标识等元数据，
    /// 框架可通过反射读取这些信息实现模型的自动注册和管理。
    /// </remarks>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
    public class ModelInfoAttribute : Attribute
    {
        /// <summary>
        /// 视图名称，用于指定模型对应的视图组件名称
        /// </summary>
        public string ViewName { get; }

        /// <summary>
        /// 分组键，用于模型分组的唯一标识（非GUID格式）
        /// </summary>
        public string GroupKey { get; }

        /// <summary>
        /// 分组显示名称，用于UI展示的分组名称
        /// </summary>
        public string GroupName { get; }

        /// <summary>
        /// 模型键，用于模型的唯一标识（非GUID格式）
        /// </summary>
        public string ModelKey { get; }

        /// <summary>
        /// 模型显示名称，用于UI展示的模型名称
        /// </summary>
        public string ModelName { get; }

        /// <summary>
        /// 分组唯一标识（GUID），用于系统内部标识分组
        /// </summary>
        public Guid GroupID { get; }

        /// <summary>
        /// 模型唯一标识（GUID），用于系统内部标识模型
        /// </summary>
        public Guid ModelID { get; }

        /// <summary>
        /// 模型版本号，默认为"1.0.0"
        /// </summary>
        public string Version { get; set; } = "1.0.0";

        /// <summary>
        /// 模型描述信息，默认为空字符串
        /// </summary>
        public string Description { get; set; } = "";

        /// <summary>
        /// 加载顺序，决定模型在系统中的加载优先级，值越小越先加载，默认为100
        /// </summary>
        public int LoadOrder { get; set; } = 100;

        /// <summary>
        /// 模型是否启用，默认为true
        /// </summary>
        public bool IsEnabled { get; set; } = true;

        /// <summary>
        /// 初始化模型信息特性的实例
        /// </summary>
        /// <param name="viewName">视图名称，不能为空</param>
        /// <param name="groupId">分组GUID字符串，必须是有效的GUID格式</param>
        /// <param name="groupKey">分组键，不能为空</param>
        /// <param name="groupName">分组显示名称，不能为空</param>
        /// <param name="modelId">模型GUID字符串，必须是有效的GUID格式</param>
        /// <param name="modelKey">模型键，不能为空</param>
        /// <param name="modelName">模型显示名称，不能为空</param>
        /// <exception cref="ArgumentNullException">当viewName、groupKey、groupName、modelKey或modelName为null时抛出</exception>
        /// <exception cref="ArgumentException">当groupId或modelId不是有效GUID格式时抛出</exception>
        public ModelInfoAttribute(
            string viewName,
            string groupId,
            string groupKey,
            string groupName,
            string modelId,
            string modelKey,
            string modelName)
        {
            ViewName = viewName ?? throw new ArgumentNullException(nameof(viewName));
            GroupKey = groupKey ?? throw new ArgumentNullException(nameof(groupKey));
            GroupName = groupName ?? throw new ArgumentNullException(nameof(groupName));
            ModelKey = modelKey ?? throw new ArgumentNullException(nameof(modelKey));
            ModelName = modelName ?? throw new ArgumentNullException(nameof(modelName));

            if (!Guid.TryParse(groupId, out Guid parsedGroupId))
                throw new ArgumentException("无效的 GroupID GUID 格式", nameof(groupId));

            if (!Guid.TryParse(modelId, out Guid parsedModelId))
                throw new ArgumentException("无效的 ModelID GUID 格式", nameof(modelId));

            GroupID = parsedGroupId;
            ModelID = parsedModelId;
        }
    }
}
